package grafica.moderador.controladores;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Properties;


import persistencia.Config;
import persistencia.PersistenciaException;

import logica.colecciones.Observadores;
import logica.datatypes.Partida.DataPartida_R1;
import logica.datatypes.Partida.DataPartida_R4;
import logica.excepciones.JugadoresException;
import logica.excepciones.PartidaException;
import logica.fachadas.IFabrica;
import logica.fachadas.IFachadaModelo;
import logica.fachadas.IFachadaModerador;
import logica.fachadas.FachadaModerador;
import logica.fachadas.IObserver;
import logica.mensajes.Mensajes;
import grafica.moderador.ventanas.VentanaIniciarPartida;
import grafica.moderador.ventanas.VentanaMenuModerador;
import grafica.moderador.ventanas.VentanaNuevaPartida;
import grafica.moderador.ventanas.VentanaReanudarPartida;
import grafica.moderador.ventanas.VentanaVerPartida;


public class ControladorMenuModerador extends UnicastRemoteObject implements Serializable{
	IFachadaModerador fachadaModerador;
	VentanaMenuModerador ventanaMenuModerador;
	private final static long serialVersionUID = 1;
	
	
    public ControladorMenuModerador(VentanaMenuModerador ventanaMenuModerador)throws RemoteException{ 
         
        this.ventanaMenuModerador = ventanaMenuModerador; 

        try{ 
        	Config conf = Config.getInstancia();
			
                String servidor = conf.getArchivoConf("Servidor"); 
                int puerto =  Integer.parseInt(conf.getArchivoConf("Puerto"));  
                IFabrica modelo;
                
                modelo = (IFabrica)Naming.lookup("//" + servidor +":" + puerto + "/fabrica"); 
                
                this.fachadaModerador = modelo.getFachadaModerador();
                modelo.agregarObservador((IObserver)ventanaMenuModerador);
    			
        } catch (NullPointerException e) { 
            setJTextPane("Error: NullPointerException"); 
        } catch (MalformedURLException e) { 
                setJTextPane("Error: MalformedURLException"); 
        } catch (NotBoundException e) { 
                setJTextPane("Error: NotBoundException");        
        } catch (RemoteException e) { 
                setJTextPane("Error RemoteException"); 
        } catch (PersistenciaException e) { 
                setJTextPane(e.darMensaje()); 
        } 
      
    }  


	public IFachadaModerador getFachadaModerador(){
		return fachadaModerador;
	}
	
	public void nuevaPartida(){
		VentanaNuevaPartida ventanaNuevaPartida = new VentanaNuevaPartida(this);
		ventanaNuevaPartida.setVisible(true);
	}
	
	public void iniciarPartida(){
		VentanaIniciarPartida ventanaIniciarPartida = new VentanaIniciarPartida(this);
		ventanaIniciarPartida.setVisible(true);
	}
	
	public void reanudarPartida(){
		VentanaReanudarPartida ventanaReanudarPartida = new VentanaReanudarPartida(this);
		ventanaReanudarPartida.setVisible(true);
	}
	
	public void verPartida(){
		VentanaVerPartida ventanaVerPartida = new VentanaVerPartida(this);
		ventanaVerPartida.setVisible(true);
	}
	
	public void detenerPartida(){
		try{	
			
			String cod=fachadaModerador.codigoPartidaEnCurso().getCodigo();
			fachadaModerador.detenerPartida(cod);	

		} catch (RemoteException e1) {
			setJTextPane("Error RemoteException");
		} catch (PartidaException e2) {
			setJTextPane(e2.darMensaje());
		}		
	}

	public void guardarCambios(){
		try{
			fachadaModerador.guardarCambios();
		} catch (RemoteException e1) {
			setJTextPane("Error RemoteException");
		} catch (PersistenciaException e3) {
			setJTextPane(e3.darMensaje());
		}
	}

	public void iniciarTurno(){
		try{
			boolean hay =fachadaModerador.hayJugadorEnTurnoEnPEnCurso();
			String cod=fachadaModerador.codigoPartidaEnCurso().getCodigo();
			fachadaModerador.iniciarTurno(cod);
			} catch (RemoteException e1) {
				setJTextPane("Error RemoteException");
			} catch (PartidaException e2) {
				setJTextPane(e2.darMensaje());
			}
	}
	
	public void cargarMapa(){
		
		try{
			fachadaModerador.cargarMapa();
			ventanaMenuModerador.setJButtonCargarMapa();
		} catch (RemoteException e1) {
			setJTextPane("Error RemoteException");
		} catch (PartidaException e2) {
			setJTextPane(e2.darMensaje());
		} catch (PersistenciaException e3) {
			setJTextPane(e3.darMensaje());	
		}
	}
/*
	public String codigoPartidaEnCurso(){
		String cod=null;
		try{
			DataPartida_R4 dataPartida_R4 = fachadaModerador.codigoPartidaEnCurso();	               
			return dataPartida_R4.getCodigo();
		} catch (RemoteException e1) {
			setJTextPane("Error RemoteException");
		}
		return cod;
	}
	*/
	
	public void setJTextPane(String text){
		ventanaMenuModerador.setJTextPane(text);
	}
	public void setJButtonCargarMapa(){
		ventanaMenuModerador.setJButtonCargarMapa();
	}
	
	public boolean hayPartidaEnCurso(){ 
        boolean hay = false; 
        try{ 
                return fachadaModerador.hayPartidaEnCurso();     
        } catch (RemoteException e1) { 
        	setJTextPane("Error RemoteException");  
        }
        return hay;/////MMMMMMMMM 
	} 

	public void habilitarBotones(){
		try{
			if(hayPartidaEnCurso()){
				ventanaMenuModerador.setjButtonReanudarPartida(false);
				ventanaMenuModerador.setjButtonIniciarPartida(false);
				ventanaMenuModerador.setjButtonNuevaPartida(false);
				ventanaMenuModerador.setjButtonDetenerPartida(true);
				boolean hay = fachadaModerador.hayJugadorLogeado();
				if (!fachadaModerador.hayJugadorEnTurnoEnPEnCurso() &&
						fachadaModerador.hayJugadorLogeado()&&!fachadaModerador.hayGanador())
					ventanaMenuModerador.setjButtonIniciarTurno(true);
				else
					ventanaMenuModerador.setjButtonIniciarTurno(false);
			}else{
				if (fachadaModerador.hayPartidaNoEnCurso())
					ventanaMenuModerador.setjButtonReanudarPartida(true);
				else
					ventanaMenuModerador.setjButtonReanudarPartida(false);
				
				if (fachadaModerador.hayPartidaNoInicializadas())
					ventanaMenuModerador.setjButtonIniciarPartida(true);
				else
					ventanaMenuModerador.setjButtonIniciarPartida(false);
				
				ventanaMenuModerador.setjButtonNuevaPartida(true);
				ventanaMenuModerador.setjButtonDetenerPartida(false);
				ventanaMenuModerador.setjButtonIniciarTurno(false);
				
				if (!fachadaModerador.noHayPartidas())
					ventanaMenuModerador.setjButtonVerPartida(true);
				else
					ventanaMenuModerador.setjButtonVerPartida(false);
				if (!fachadaModerador.noHayPartidas())
					ventanaMenuModerador.setjButtonGuardarWar(true);
				else
					ventanaMenuModerador.setjButtonGuardarWar(false);				
			}
		} catch (RemoteException e1) {
			setJTextPane("Error RemoteException");
		}
	}
	
	public void actualizar(){
		String mensaje;
		try {
			mensaje = fachadaModerador.getMensajeModerador();
			setJTextPane(mensaje);
			habilitarBotones();
		} catch (RemoteException e) {
			setJTextPane(e.getMessage());
		}		
	}
	
	public String obtenerIcono(){
		String rutaImagen = new String();
		try {
			Config conf = Config.getInstancia();
			rutaImagen = conf.getArchivoConf("rutaIcono");
		} catch (PersistenciaException e) {
			ventanaMenuModerador.setJTextPane(e.darMensaje());
		}		
		return rutaImagen;
	}
}
